package cn.chencq.math;

/**
 * 
 * @ClassName: BigDataCalculate
 * @Description: 大整数计算
 * @Author: chaoqun.chen
 * @Date: 2018年12月12日 下午4:36:16
 */
public class BigDataCalculate {

	public static String add(String a, String b) {
		StringBuffer result = new StringBuffer();
		/**
		 * step1: 比较a,b数据长度，将长度短的那个数据用'0'补高位方式，将两个变成相同的长度
		 */
		long aLen = a.length();
		long bLen = b.length();

		long dLen = aLen - bLen > 0 ? (aLen - bLen) : (bLen - aLen);
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < dLen; i++) {
			sb.append('0');
		}

		/**
		 * step2: 反转处理之后的字符串
		 */
		String aRev = "";
		String bRev = "";

		if (aLen > bLen) {
			bRev = sb.append(b).reverse().toString();
			aRev = new StringBuffer(a).reverse().toString();
		} else {
			aRev = sb.append(a).reverse().toString();
			bRev = new StringBuffer(b).reverse().toString();
		}

		System.out.println(aRev + ", " + bRev);

		/**
		 * step3: 反转的字符按数组位相加
		 */
		int len = aRev.length();
		boolean nOverFlow = false; // 是否越界
		int nTakeOver = 0; // 溢出数量

		for (int j = 0; j < len; j++) {
			int sum = Integer.parseInt(aRev.charAt(j) + "") + Integer.parseInt(bRev.charAt(j) + "") + nTakeOver;
			if (sum >= 10) {
				if (j == len - 1)
					nOverFlow = true;

				nTakeOver = 1;
				result.append(sum - 10);
			} else {
				nTakeOver = 0;
				result.append(sum);
			}
		}

		// 如果溢出的话表示位增加了
		if (nOverFlow) {
			result.append(nTakeOver);
		}

		/**
		 * step4: 将反转按位相加的字符串再进行一次反转
		 */
		return result.reverse().toString();

	}

	public static void main(String[] args) {
		String a = "7543545453993858900";
		String b = "32435213299385";
		System.out.println(add(a, b));
	}

}
